﻿using FreeSql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace KJSyncXP.Oracle.Context
{
    public class OracleDbContext : IDisposable
    { 
        private IFreeSql _freeSql;

        private bool _disposed = false;

        /// <summary>
        /// 构造函数（接收连接字符串，初始化 FreeSQL）
        /// </summary>
        public OracleDbContext(string oracleConnString)
        {

            try
            {
                if (string.IsNullOrEmpty(oracleConnString))
                    throw new ArgumentNullException("oracleConnString", "Oracle 连接字符串不能为空");

                _freeSql = new FreeSqlBuilder()
                    .UseConnectionString(DataType.Oracle, oracleConnString) // DataType.OleDb 适配 Access
                    .Build();

            }
            catch (Exception ex) { 
                throw new Exception("初始化 Oracle 数据库上下文失败：" + ex.Message);
            }
        }

        /// <summary>
        /// 对外提供 FreeSQL 实例（用于 CRUD 操作）
        /// </summary>
        public IFreeSql Db => _freeSql;

        /// <summary>
        /// 释放资源（手动调用或 using 自动调用）
        /// </summary>
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }


        /// <summary>
        /// 实际释放逻辑（释放 FreeSQL 连接资源，适配 3.0+ 版本）
        /// </summary>
        protected virtual void Dispose(bool disposing)
        {
            if (_disposed) return;

            // 释放托管资源：FreeSQL 3.0+ 已实现 IDisposable，直接调用 Dispose 即可
            if (disposing && _freeSql != null)
            {
                _freeSql.Dispose(); // 内部自动关闭底层 OleDbConnection + 释放连接池资源
                _freeSql = null;    // 置空避免重复释放
            }

            _disposed = true; // 标记已释放，防止重复调用
        }


        /// <summary>
        /// 析构函数（防止忘记手动释放）
        /// </summary>
        ~OracleDbContext()
        {
            Dispose(false);
        }

    }
}
